#include <fstream>
#include <inja/inja.hpp>
#include <iostream>
#include <string>
bool get_file_content(const std::string& file_path, std::string& str_)
{
    std::ifstream template_file(file_path);
    if (template_file) {
        std::string str((std::istreambuf_iterator<char>(template_file)), std::istreambuf_iterator<char>());
        str_ = str;
        return true;
    }
    return false;
}

bool get_file_json_content(const std::string& file_path, nlohmann::json& json)
{
    try {
        std::ifstream template_file(file_path);
        if (template_file) {
            std::string json_string((std::istreambuf_iterator<char>(template_file)), std::istreambuf_iterator<char>());
            json=nlohmann::json::parse(json_string);
            return true;
        }
    } catch (const std::exception& e) {
        std::cerr << "Error parsing JSON: " << e.what() << std::endl;
        return false;
    }
    return false;
}

int main(int argc, char* argv[])
{
    // 解析参数
    nlohmann::json params;
    for (int i = 1; i < argc; ++i) {
        std::string arg = argv[i];
        if (arg.find("--") == 0) {              // 检查是否为参数
            std::string key = arg.substr(2);    // 去掉前缀 --
            if (i + 1 < argc) {                 // 确保后面有值
                params[key] = argv[++i];        // 存储参数
            }
        }
    }
    std::cout << params.dump() << std::endl;
    std::string template_string = "";
    std::string target_file     = params["target"].get<std::string>();
    if (!get_file_content(target_file, template_string)) {
        if (!get_file_content(params["template"].get<std::string>(), template_string)) {
            std::cerr << "Error opening template!" << std::endl;
            return 1;
        }
    } else {
        nlohmann::json json_array;
        if (get_file_json_content(params["template_json"].get<std::string>(), json_array) && json_array.is_array()) {
            // 字符替换
            for (const auto& element : json_array) {
                if (element.is_object()) {
                    std::string to_replace  = element["old_str"].get<std::string>();
                    std::string replacement = element["new_str"].get<std::string>();
                    size_t pos              = template_string.find(to_replace);
                    if (pos != std::string::npos) {
                        template_string.erase(pos, to_replace.length());    // 删除原字符串
                        template_string.insert(pos, replacement);           // 插入替换字符串
                    }
                }
            }
        }
    }
    nlohmann::json json_data;
    if (!get_file_json_content(params["data"].get<std::string>(), json_data) || !json_data.is_object()) {
        std::cerr << "can`t get data " << std::endl;
        return 1;
    }
    // 创建一个 Inja 环境
    inja::Environment env;
    //     渲染模板
    std::string rendered = env.render(template_string, json_data);
    std::ofstream output_file(target_file);
    output_file << template_string << std::endl;
    output_file.close();

    // 输出结果
    std::cout << rendered << std::endl;

    return 0;
}